#include <stdio.h>
#include <stdlib.h>
#include "heap.h"

#define DOS 2
#define CERO 0
#define UNO 1

int comparacion (const int* a ,const int* b){
	if((*a) < (*b)) return -1;
	if((*a) > (*b)) return 1;
	return 0;
}

void print_test(char* name, bool result)
{
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}

void prueba_heap(){
	int valores[] = {30,1,76,43,7,0,5,4,2,67,11};
	heap_t* heap = heap_crear(comparacion);
	print_test("Prueba heap crear heap vacio", heap != NULL);
	print_test("Prueba heap la cantidad de elementos es 0", heap_cantidad(heap) == 0);
	print_test("Prueba heap heap vacio", heap_esta_vacio(heap));
	print_test("Prueba heap ver maximo es NULL", heap_ver_max(heap) == NULL);
	print_test("Prueba heap desencolar es NULL", heap_desencolar(heap) == NULL);
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[0]));
	print_test("Prueba heap la cantidad de elementos es 1", heap_cantidad(heap) == 1);
	print_test("Prueba heap ver maximo ", heap_ver_max(heap) == &valores[0]);
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[1]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[2]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[3]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[4]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[5]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[6]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[7]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[8]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[9]));
	print_test("Prueba heap encolar ", heap_encolar(heap,&valores[10]));
	print_test("Prueba heap la cantidad de elementos es 11", heap_cantidad(heap) == 11);
	print_test("Prueba heap ver maximo ", heap_ver_max(heap) == &valores[2]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[2]);
	print_test("Prueba heap la cantidad de elementos es 10", heap_cantidad(heap) == 10);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[9]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[3]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[0]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[10]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[4]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[6]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[7]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[8]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[1]);
	print_test("Prueba heap desencolar ", heap_desencolar(heap) == &valores[5]);
	print_test("Prueba heap la cantidad de elementos es 0", heap_cantidad(heap) == 0);
	print_test("Prueba heap heap vacio", heap_esta_vacio(heap));
	print_test("Prueba heap ver maximo es NULL", heap_ver_max(heap) == NULL);
	print_test("Prueba heap desencolar es NULL", heap_desencolar(heap) == NULL);
	heap_destruir(heap,NULL);
}

void prueba_heapsort(){
	int **vector=malloc(sizeof(int*)*5);
	int i;
	for(i=0;i<5;i++){
		vector[i] = malloc(sizeof(int));
	}
	*vector[0] = 3;
	*vector[1] = 0;
	*vector[2] = 105;
	*vector[3] = 43;
	*vector[4] = 8;
	heapsort(vector,5,comparacion);
	print_test("Prueba heap ", *vector[0]  == 0);
	print_test("Prueba heap ", *vector[1]  == 3);
	print_test("Prueba heap ", *vector[2]  == 8);
	print_test("Prueba heap ", *vector[3]  == 43);
	print_test("Prueba heap ", *vector[4]  == 105);
	for(i=0;i<5;i++){
		free(vector[i]);
	}
	free(vector);
}
	
		
	

int main(){
	prueba_heap();
	prueba_heapsort();
	return 0;
}
